fix: replace uvicorn log_config with basicConfig for consistent log format#25
Conversation
Kaiohz
left a comment
There was a problem hiding this comment.
Code Review — PR #25
📊 Score : 8/10
✅ Ce qui est bien fait
-
Simplification bienvenue — Remplacer le
LOG_CONFIGdict +log_config=Nonepar un simplelogging.basicConfig()est la bonne approche. Moins de code, moins d'indirection, plus lisible. -
Cohérence entre projets — Le pattern correspond exactement à ce qui est fait dans
mcp-raganything/main.py(même format, mêmedatefmt). C'est le bon réflexe pour homogénéiser le logging across les services SoluDevTech. -
Format de log amélioré — Le passage de
%(asctime)s - %(name)s - %(levelname)s - %(message)sà%(asctime)s | %(levelname)-8s | %(name)s | %(message)sest un upgrade :- Les
|sont plus lisibles que les-(séparateur visuel clair) %(levelname)-8savec alignement fixe → colonnes visuellement alignées dans les logs- Le
datefmtexplicite%Y-%m-%d %H:%M:%Sélimine le format par défaut moche de Python
- Les
-
Suppression de
force=True— C'est correct.force=Trueest utile quand tu dois reconfigurer un logger déjà existant, mais ici au startup c'est le premier appel, pas besoin. -
Suppression de
import sysetstream=sys.stdout— Propre.basicConfigécrit surstderrpar défaut, mais uvicorn redirige déjà correctement les logs. Pas besoin de forcerstdout.
⚠️ Points à améliorer
-
Niveau de log hardcodé vs. settings —
level=logging.INFOest hardcodé alors quesettings.log_levelexiste et est utilisé pour uvicorn. Dans mcp-raganything, le pattern estlevel=app_config.UVICORN_LOG_LEVEL.upper(). Ici, si quelqu'un metLOG_LEVEL=DEBUGdans l'env, les logs Python resteront à INFO mais uvicorn sera en DEBUG. Incohérent.Suggestion :
logging.basicConfig( level=getattr(logging, settings.log_level.upper(), logging.INFO), format="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s", datefmt="%Y-%m-%d %H:%M:%S", )
-
Suppression de
logging.getLogger().setLevel(logging.INFO)— OK sibasicConfigsuffit, mais attention : cette ligne était un filet de sécurité pour forcer le root logger à INFO même si une lib tierce l'avait changé. Si une dépendance importée avant ce fichier configure le root logger,basicConfigne fait rien (il ne s'applique que si aucun handler n'existe encore). Leforce=Trued'origine gérait ce cas.Suggestion alternative : Garder
force=Truesi tu veux garantir la config même en cas d'imports parasites :logging.basicConfig( level=getattr(logging, settings.log_level.upper(), logging.INFO), format="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s", datefmt="%Y-%m-%d %H:%M:%S", force=True, )
-
Pas de newline à la fin du fichier — Le diff montre
\ No newline at end of file. Ajoute un saut de ligne final, c'est une convention POSIX et la plupart des éditeurs/linters le signalent.
📝 Résumé
| Aspect | Note |
|---|---|
| Simplicité / lisibilité | ⭐⭐⭐⭐⭐ |
| Cohérence inter-projets | ⭐⭐⭐⭐⭐ |
| Format des logs | ⭐⭐⭐⭐⭐ |
| Config dynamique (log level) | ⭐⭐⭐ |
| Robustesse (force/handlers) | ⭐⭐⭐ |
La direction est la bonne — c'est un nettoyage de tech debt qui améliore la lisibilité et la cohérence. Les 2 points à adresser (log level dynamique + newline) sont mineurs mais valent le coup d'être fixés avant merge.
Kaiohz
left a comment
There was a problem hiding this comment.
Code Review — PR #25
📊 Score : 8/10
✅ Ce qui est bien fait
-
Simplification bienvenue — Remplacer le
LOG_CONFIGdict +log_config=Nonepar un simplelogging.basicConfig()est la bonne approche. Moins de code, moins de 'indirection, plus lisible. -
Cohérence entre projets — Le pattern correspond exactement à ce qui est fait dans
mcp-raganything/main.py(même format, mêmedatefmt). C'est le bon réflexe pour homogénéiser le logging across les services SoluDevTech. -
Format de log amélioré — Le passage de
%(asctime)s - %(name)s - %(levelname)s - %(message)sà%(asctime)s | %(levelname)-8s | %(name)s | %(message)sest un upgrade :- Les
|sont plus lisibles que les-(séparateur visuel clair) %(levelname)-8savec alignement fixe → colonnes visuellement alignées dans les logs- Le
datefmtexplicite%Y-%m-%d %H:%M:%Sélimine le format par défaut moche de Python
- Les
-
Suppression de
force=True— C'est correct.force=Trueest utile quand tu dois reconfigurer un logger déjà existant, mais ici au startup c'est le premier appel, pas besoin. -
Suppression de
import sysetstream=sys.stdout— Propre.basicConfigécrit surstderrpar défaut, mais uvicorn redirige déjà correctement les logs. Pas besoin de forcerstdout.
⚠️ Points à améliorer
-
Niveau de log hardcodé vs. settings —
level=logging.INFOest hardcodé alors quesettings.log_levelexiste et est utilisé pour uvicorn. Dans mcp-raganything, le pattern estlevel=app_config.UVICORN_LOG_LEVEL.upper(). Ici, si quelqu'un metLOG_LEVEL=DEBUGdans l'env, les logs Python resteront à INFO mais uvicorn sera en DEBUG. Incohérent.Suggestion :
logging.basicConfig( level=getattr(logging, settings.log_level.upper(), logging.INFO), format="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s", datefmt="%Y-%m-%d %H:%M:%S", )
-
Suppression de
logging.getLogger().setLevel(logging.INFO)— OK sibasicConfigsuffit, mais attention : cette ligne était un filet de sécurité pour forcer le root logger à INFO même si une lib tierce l'avait changé. Si une dépendance importée avant ce fichier configure le root logger,basicConfigne fait rien (il ne s'applique que si aucun handler n'existe encore). Leforce=Trued'origine gérait ce cas.Suggestion alternative : Garder
force=Truesi tu veux garantir la config même en cas d'imports parasites :logging.basicConfig( level=getattr(logging, settings.log_level.upper(), logging.INFO), format="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s", datefmt="%Y-%m-%d %H:%M:%S", force=True, )
-
Pas de newline à la fin du fichier — Le diff montre
\ No newline at end of file. Ajoute un saut de ligne final, c'est une convention POSIX et la plupart des éditeurs/linters le signalent.
📝 Résumé
| Aspect | Note |
|---|---|
| Simplicité / lisibilité | ⭐⭐⭐⭐⭐ |
| Cohérence inter-projets | ⭐⭐⭐⭐⭐ |
| Format des logs | ⭐⭐⭐⭐⭐ |
| Config dynamique (log level) | ⭐⭐⭐ |
| Robustesse (force/handlers) | ⭐⭐⭐ |
La direction est la bonne — c'est un nettoyage de tech debt qui améliore la lisibilité et la cohérence. Les 2 points à adresser (log level dynamique + newline) sont mineurs mais valent le coup d'être fixés avant merge.
Replace verbose LOG_CONFIG dict and
log_config=Nonein uvicorn with a singlelogging.basicConfig()call. Matches the same pattern used in mcp-raganything.